#!/bin/bash
# 归档文件还原脚本

set -euo pipefail

if [ "$#" -lt 2 ]; then
    echo "用法: $0 <存放备份ZIP文件路径> <备份目录路径> [标记名字, 例如 202506] [留下多少天数据]"
    exit 1
fi

ARCHIVE_DIR="$1"
TARGET_DIR="$2"
CURRENT_MONTH="${3:-$(date +%Y%m)}"
DAYS_TO_KEEP="${4:-30}"

LOG_FILE="${ARCHIVE_DIR}/restore.log"

#CURRENT_MONTH=$(date +%Y%m)
ARCHIVE_NAME="${ARCHIVE_DIR}/${CURRENT_MONTH}_archive.zip"
CHECKSUM_FILE="${ARCHIVE_DIR}/${CURRENT_MONTH}_checksums.sha256"

mkdir -p "$ARCHIVE_DIR"
touch "$CHECKSUM_FILE"
touch "$LOG_FILE"

# 创建空 zip，如果不存在
if [ ! -f "$ARCHIVE_NAME" ]; then
    echo "[$(date +%Y%m%d-%H%M%S)] 创建空归档 zip 包 $ARCHIVE_NAME" | tee -a "$LOG_FILE"
    python -c "import zipfile; zipfile.ZipFile('$ARCHIVE_NAME', 'w').close()"
fi

echo "[$CURRENT_MONTH] 开始处理单文件压缩归档" | tee -a "$LOG_FILE"

cd "$TARGET_DIR"

# 查找目标文件，逐个处理
find . -type f -mtime +"$DAYS_TO_KEEP" -print0 | while IFS= read -r -d '' file; do
    REL_PATH="${file#./}"  # 相对路径
    ABS_PATH="${TARGET_DIR}/${REL_PATH}"

    # 检查是否已归档（通过 zip 中是否已存在该文件名）
    # if unzip -Z1 "$ARCHIVE_NAME" 2>/dev/null | grep -qxF "$REL_PATH"; then
    #     echo "已存在于归档中，跳过: $REL_PATH" | tee -a "$LOG_FILE"
    #     continue
    # fi

    echo "处理文件: $REL_PATH" | tee -a "$LOG_FILE"

    # 添加到 zip 包
    if zip -rqg "$ARCHIVE_NAME" "$REL_PATH"; then
        # 验证是否成功归档,大文件会拖慢效率
        #if unzip -Z1 "$ARCHIVE_NAME" | grep -qxF "$REL_PATH"; then
            # 记录校验
            sha256sum "$REL_PATH" | sed "s|$REL_PATH|./$REL_PATH|" >> "$CHECKSUM_FILE"
            rm -fv "$REL_PATH" | tee -a "$LOG_FILE"
        #else
        #    echo "归档验证失败，保留文件: $REL_PATH" | tee -a "$LOG_FILE"
        #fi
    else
        echo "压缩失败，跳过: $REL_PATH" | tee -a "$LOG_FILE"
    fi
done

# 对归档包本身生成校验和
(cd "$ARCHIVE_DIR" && sha256sum "$(basename "$ARCHIVE_NAME")" >> "$CHECKSUM_FILE")

echo "[$(date +%Y%m%d-%H%M%S)] 单文件归档处理完成" | tee -a "$LOG_FILE"

